From d02506a27f2085f79ab34c40c599c5dbef8f3214 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Sat, 12 Jul 2003 23:47:14 +0000 Subject: [PATCH] bitkeeper revision 1.339.1.2 (3f109e02qA-VmVFt9cmV0JaASgeSeg) proc_cmd.h, dom0_core.c, xl_block.c: Bug fixes to new proc interface. --- .../arch/xeno/drivers/block/xl_block.c | 10 ++++------ .../arch/xeno/drivers/dom0/dom0_core.c | 15 +++++++++++++++ .../include/asm-xeno/proc_cmd.h | 14 +++++++++----- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c index 565b07238d..2ab23d00ad 100644 --- a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c +++ b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c @@ -507,9 +507,7 @@ static void xlblk_response_int(int irq, void *dev_id, struct pt_regs *ptregs) case XEN_BLOCK_PROBE_BLK: case XEN_BLOCK_PHYSDEV_GRANT: case XEN_BLOCK_PHYSDEV_PROBE: - if ( bret->status ) - printk(KERN_ALERT "Bad return from blkdev control request\n"); - xlblk_control_msg_pending = 0; + xlblk_control_msg_pending = bret->status; break; default: @@ -547,19 +545,19 @@ int xenolinux_control_msg(int operation, char *buffer, int size) if ( aligned_buf == NULL ) BUG(); memcpy(aligned_buf, buffer, size); - xlblk_control_msg_pending = 1; + xlblk_control_msg_pending = 2; spin_lock_irqsave(&io_request_lock, flags); /* Note that size gets rounded up to a sector-sized boundary. */ if ( hypervisor_request(0, operation, aligned_buf, 0, (size+511)/512, 0) ) return -EAGAIN; signal_requests_to_xen(); spin_unlock_irqrestore(&io_request_lock, flags); - while ( xlblk_control_msg_pending ) barrier(); + while ( xlblk_control_msg_pending == 2 ) barrier(); memcpy(buffer, aligned_buf, size); free_page((unsigned long)aligned_buf); - return 0; + return xlblk_control_msg_pending ? -EINVAL : 0; } diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c index 837dd6dad0..20db18af74 100644 --- a/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c +++ b/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c @@ -47,8 +47,10 @@ static int privcmd_ioctl(struct inode *inode, struct file *file, case IOCTL_PRIVCMD_HYPERCALL: { privcmd_hypercall_t hypercall; + if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) ) return -EFAULT; + __asm__ __volatile__ ( "pushl %%ebx; pushl %%ecx; pushl %%edx; pushl %%esi; pushl %%edi; " "movl 4(%%eax),%%ebx ;" @@ -68,34 +70,47 @@ static int privcmd_ioctl(struct inode *inode, struct file *file, privcmd_blkmsg_t blkmsg; char *kbuf; int ret; + if ( copy_from_user(&blkmsg, (void *)data, sizeof(blkmsg)) ) return -EFAULT; + if ( blkmsg.buf_size > PAGE_SIZE ) return -EINVAL; + if ( (kbuf = kmalloc(blkmsg.buf_size, GFP_KERNEL)) == NULL ) return -ENOMEM; + if ( copy_from_user(kbuf, blkmsg.buf, blkmsg.buf_size) ) { kfree(kbuf); return -EFAULT; } + ret = xenolinux_control_msg((int)blkmsg.op, kbuf, blkmsg.buf_size); if ( ret != 0 ) { kfree(kbuf); return ret; } + if ( copy_to_user(blkmsg.buf, kbuf, blkmsg.buf_size) ) { kfree(kbuf); return -EFAULT; } + kfree(kbuf); } break; case IOCTL_PRIVCMD_LINDEV_TO_XENDEV: + { ret = (int)xldev_to_physdev((kdev_t)data); + } + break; case IOCTL_PRIVCMD_XENDEV_TO_LINDEV: + { ret = (int)physdev_to_xldev((unsigned short)data); + } + break; default: { diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h b/xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h index 89386f4ff8..66308397eb 100644 --- a/xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h +++ b/xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h @@ -7,11 +7,6 @@ #ifndef __PROC_CMD_H__ #define __PROC_CMD_H__ -#define IOCTL_PRIVCMD_HYPERCALL 0 -#define IOCTL_PRIVCMD_BLKMSG 1 -#define IOCTL_PRIVCMD_LINDEV_TO_XENDEV 2 -#define IOCTL_PRIVCMD_XENDEV_TO_LINDEV 3 - typedef struct privcmd_hypercall { unsigned long op; @@ -25,4 +20,13 @@ typedef struct privcmd_blkmsg int buf_size; } privcmd_blkmsg_t; +#define IOCTL_PRIVCMD_HYPERCALL \ + _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t)) +#define IOCTL_PRIVCMD_BLKMSG \ + _IOC(_IOC_NONE, 'P', 1, sizeof(privcmd_blkmsg_t)) +#define IOCTL_PRIVCMD_LINDEV_TO_XENDEV \ + _IOC(_IOC_NONE, 'P', 2, sizeof(unsigned short)) +#define IOCTL_PRIVCMD_XENDEV_TO_LINDEV \ + _IOC(_IOC_NONE, 'P', 3, sizeof(unsigned short)) + #endif /* __PROC_CMD_H__ */ -- 2.30.2